/* (C)oded by ESPRIT 2014 - 3B2 - Undrained Group*/
/* Par: atef akrout*/

#include "personnel.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "configuration.h"
#include "cryptage.h"
#include "login.h"
#include "gestion_personnels.h"

void modifier_pass_personnel_gtk(personnel_db personnel[], int nbre_personnel, int id, char pass[], char msg[] )
{
	int i;
	i = recherche_personnel(personnel, id, nbre_personnel);
	if ( i != -1 )
	{
        if ( strlen(pass) > 8)
		{
			cryptage(pass);
			strcpy(personnel[i].mot_de_passe,pass);
			exporter_personnels(personnel,nbre_personnel);
			strcpy(msg,"le mot de passe est change");
		}
		else
			strcpy(msg,"le mot de passe est change");
	}
	else
		strcpy(msg,"le personnel n'existe pas");
}

void modifier_pass_admin_gtk(char passeport[], char pass[], char msg[])
{
		FILE *f;
        if (strlen (passeport) == 9){
			if (strlen (pass) > 8 )
			{
                cryptage(pass);
				f = fopen(FICHIER_ADMIN,"w");
				fprintf(f,"%s %s\n",passeport,pass);
				fclose(f);
				strcpy(msg,"mot de passe est change");
			}
			else
			{
				strcpy(msg,"le mot de passe est court");
			}
		} else
		{
			strcpy(msg,"le passeport est incorrect");
		}
}

void modifier_pass_admin()
{
        char passeport [20];
        char pass[20];

	FILE *f;
        do {
                printf("\n[+] Entrer le numero du passeport pour l'admin (9 caractere) : ");
                scanf("%s",passeport);
         } while (strlen (passeport) != 9);
         do {
                printf("[+] Entrer un mot de passe pour l'admin (au moins 8 caractere): ");
                scanf("%s",pass);
                cryptage(pass);
         } while (strlen (pass) < 8 );
	f = fopen(FICHIER_ADMIN,"w");
	fprintf(f,"%s %s\n",passeport,pass);
	fclose(f);
}

void modifier_pass_personnel(personnel_db personnel[], int nbre_personnel )
{
	int id,i;
	afficher_personnel_db(personnel,nbre_personnel);
	printf("> ID: ");
	scanf("%d",&id);
	i = recherche_personnel(personnel, id, nbre_personnel);
	if ( i != -1 )
	{
        do {
		printf("                [+] Veuillez saisir nouveau le mot de passe du personnel: ");
		fflush(stdin);
		scanf("%s",personnel[i].mot_de_passe);
		cryptage(personnel[i].mot_de_passe);
	}
	while (strlen (personnel[i].mot_de_passe) < 8);
	}
	exporter_personnels(personnel,nbre_personnel);
}

void creer_compte_admin()
{
	FILE *f;
	int x;
	if ( (access(FICHIER_ADMIN,F_OK) != -1))
		x = 1; // le fichier existe
	else
		x = 0; //le fichier n'existe pas

	if(x==0)
	{
		//ouvrir_fichier_ecrire(f, FICHIER_ADMIN);
		printf("[!] Bienvenu,\nc'est la premiere fois que vous utilisez notre logiciel\nIl faut creer un compte pour l'Administrateur\n");
		modifier_pass_admin();
		printf("[!] Un compte pour l'admin est cree !!\n");
	}
}


void creer_compte_admin_gtk(char passeport[], char pass[], char msg[])
{
	FILE *f;
	int x;
	if ( (access(FICHIER_ADMIN,F_OK) != -1))
		x = 1; // le fichier existe
	else
		x = 0; //le fichier n'existe pas

	if(x==0)
	{
		if (strlen (passeport) != 9)
		{
			strcpy(msg,"le passeport doit contenir 9 caractére");
		}
		else
		{
			if (strlen (pass) < 8 )
			{
				strcpy(msg,"le mot de passe doit etre au moins 8 caractére");
			}
			else
			{
				cryptage(pass); 
				f = fopen(FICHIER_ADMIN,"w");
				fprintf(f,"%s %s\n",passeport,pass);
				fclose(f);
				strcpy(msg,"un compte pour l'admin est cree !!");
			}
		}
	}
}

int login(personnel_db personnel[], int n_personnels)
{
/* lire le fichier qui contient l'identifiant et le mot de passe et
les comparer avec ce que donne l'utilisateur si il n'existe pas donc l'utilisateur n'est pas un admin on chercher dans personnels.motdepass

si l'utilisateur donne des informations incorrectes pour trois la fonction retourne 0
si l'utilisateur est un admin la fonction retourne 1
si l'utilisateur est un personnel la fonction retourne 2*/
	char ci [20];
	char motdepass[20];
	int admin = 0;
	int essaie = 3;
	int pos = -1;
	int k = 0;
	char passeport [20];
	char pass[20];

	FILE* f;

	printf("[!] Bonjour, Entrez votre passeport et Mot de pass (Admin Ou Personnel) pour se connecter !! \n");
	while ((essaie>0) && (admin == 0))
	{
		admin = 0;
		printf("\n[!] Vous avez %d essaies restantes\n",essaie);

		printf("> passeport: ");
		fflush(stdin);
		scanf("%s",passeport);
		printf("> Mot de passe: ");
		fflush(stdin);
		scanf("%s",pass);


		//ouvrir_fichier_lire(f,FICHIER_ADMIN);
		f = fopen(FICHIER_ADMIN,"r");
		fscanf(f,"%s %s",ci,motdepass);
		fclose(f);
		decryptage(motdepass); // Ajouter par marouen
		if ( strcmp (ci,passeport) ==0)
		{
			if ( strcmp(motdepass,pass) == 0 )
			{
				admin = 1;
				printf("[!] Bienvenu Admin\n");
			}
			else
			{
				essaie = essaie - 1;
				admin = 0;
				printf("[!] Mot de pass de l'Admin est incorrect\n");
			}
		}
		else
		{
			if(n_personnels!=0)
			{
				while (( pos == -1) && ( k <= n_personnels ))
				{
					if (personnel[k].passeport == passeport )
						pos = k;
					else
						k++;
				}

				if ( pos == -1 )
				{
					essaie--;
					printf("[!] Le passeport n'existe pas\n");
				}
				else
				{
					decryptage(personnel[pos].mot_de_passe); 
					if (strcmp(personnel[pos].mot_de_passe,pass) == 0 )
					{
						admin = 2;
						printf("[!] Bienvenu %s %s\n",personnel[pos].nom,personnel[pos].prenom);
					}
					else
					{
						printf("[!] Mot de passe du personnel incorrect\n");
						admin = 0;
						essaie--;
					}
				}
			}
			else
			{	printf("[!] Le passeport n'existe pas\n");	essaie--;}
		}
	}
	return admin;
}


int login_gtk(personnel_db personnel[], int n_personnels,char passeport[],char pass[], char msg[])
{
/* lire le fichier qui contient l'identifiant et le mot de passe et
les comparer avec ce que donne l'utilisateur si il n'existe pas donc l'utilisateur n'est pas un admin on chercher dans personnels.motdepass

si l'utilisateur donne des informations incorrectes pour trois la fonction retourne 0
si l'utilisateur est un admin la fonction retourne 1
si l'utilisateur est un personnel la fonction retourne 2*/
	char ci [20];
	char motdepass[20];
	int admin = 0;
	int essaie = 3;
	int pos = -1;
	int k = 0;

	FILE* f;
	while ((essaie>0) && (admin == 0))
	{
		admin = 0;
		//ouvrir_fichier_lire(f,FICHIER_ADMIN);
		f = fopen(FICHIER_ADMIN,"r");
		
		fscanf(f,"%s %s",ci,motdepass);
		
		fclose(f);
		
		decryptage(motdepass); // Ajouter par marouen
		
		if ( strcmp (ci,passeport) ==0)
		{
			if ( strcmp(motdepass,pass) == 0 )
			{
				admin = 1;
				strcpy(msg,"Bienvenu Admin");
			}
			else
			{
				essaie = essaie - 1;
				admin = 0;
				strcpy(msg,"Mot de pass de l'Admin est incorrect");
			}
		}
		else
		{
			if(n_personnels!=0)
			{
				while (( pos == -1) && ( k <= n_personnels ))
				{
					if (personnel[k].passeport == passeport )
						pos = k;
					else
						k++;
				}

				if ( pos == -1 )
				{
					essaie--;
					strcpy(msg,"Le passeport n'existe pas");
				}
				else
				{
					decryptage(personnel[pos].mot_de_passe); 
					if (strcmp(personnel[pos].mot_de_passe,pass) == 0 )
					{
						admin = 2;
						strcpy(msg,"Bienvenu !!");
					}
					else
					{
						strcpy(msg,"Mot de passe du personnel incorrect");
						admin = 0;
						essaie--;
					}
				}
			}
			else
			{	strcpy(msg,"Le passeport n'existe pas");	essaie--;}
		}
	}
	return admin;
}

void extraire_passes(login_db l[], int *n)
{
        FILE *f;
        f = fopen(FICHIER_LOGIN,"r");
        if ( f != NULL)
        {
                debug("Chargement des donnees mots de passes");
                while ( fscanf(f,"%s %s %d",l[*n].mot_de_passe, l[*n].passeport, &l[*n].type) != EOF)

                {
                        debug("les donnees du '%ld' sont chargees",l[*n].passeport);
                        *n = *n + 1;
                }
                fclose(f);
        }
        else
                debug("Impossible de charger les donnees des personels");

}
void exporter_passes(login_db l[], int n)
{
        int i=0;
        FILE *f;

        remove(FICHIER_LOGIN);
  	f = fopen(FICHIER_LOGIN,"w");
    	if ( f != NULL)
        {
                        for ( i = 0; i < n ; i++)
{
                                debug("Exportation des mot de passes '%s' ",l[i].passeport);
                                fprintf(f,"\n%s %s %d",l[i].mot_de_passe,l[i].passeport,l[i].type);
                        }
                        fclose(f);
         }
         else
                        debug("Impossible d'ajouter '%s'",l[i].passeport);

        debug("Exportation fini");
}

int recherche_passes(login_db l[], char id[], int n )
{
	int pos,k;
	pos = -1;
	k = 0;
	while (( pos == -1) && ( k < n ))
	{
		if (strcmp(l[k].passeport,id ) == 0)
			pos = k;
		else
			k++;
	}
	if ( pos == -1 )
		printf("[!] n'existe pas\n");
	return pos;
}

void modifier_passes(login_db l[], int n )
{ 
	char mp[100];
	char passeport[30];
 	int i;
	
	afficher_passes(l,n);
	printf("Entre le passeport: ");
	scanf("%s",passeport);
	
	i = recherche_passes( l,passeport,n );
	printf("donner le nouveaux mot de passe");
	scanf("%s",mp);
	strcpy(l[i].mot_de_passe,mp);

}

void afficher_passes(login_db l[], int n)
{
   int i = 0;
	printf("[!] Le nombre de mots de passes: %d\n",n);
	if ( n <= 0)
		printf("[!] La liste est vide\n");
	else
	{
	
		for (i=0;i<n;i++)
		{
			printf("type: %d\n",l[i].type);
			printf("passeport:%s\n",l[i].passeport);
			printf("mot_de_passe:%s\n",l[i].mot_de_passe);
		}
	}
}





